package com.ftg.learn.chapter09;

import com.ftg.learn.chapter07.Tip;

import java.util.Arrays;

/**
 * @author kangjx
 * @createTime 2022/7/22
 */
public class LineArray {

    //里氏代替原则   职责单一原则  开闭原则

    private int[] arr;
    private int index = 0;

    public LineArray(){
        arr = new int[10];
    }

    /**
     * 方法 重载
     * 用来实现添加功能
     * @param t  值
     * @return true
     */
    public boolean add(int t){
        capacityExpansion();
        arr[index++] = t;
        return true;
    }

    /**
     * 多个添加
     * @param t
     * @return
     */
    public boolean add(int... t){

        if(t.length == 0){
            throw new IllegalArgumentException(Tip.INDEX_LEN_ZERO);
        }
        for (int i : t) {
            this.add(i);
        }
        return true;
    }

    /**
     * 扩容
     */
    private void capacityExpansion(){
        if(index == arr.length){
            int newLen = arr.length + (arr.length >> 1);
            arr = Arrays.copyOf(arr,newLen);
        }
    }

    /**
     * 我们想把index这个下标的值改成t
     * @param index  下标
     * @param t      新值
     * @return       true
     */
    public boolean update(int index,int t){
        checkIndexException(index);
        arr[index] = t;
        return true;
    }

    private void checkIndexException(int index){
        if(index >= this.index){
            throw new IllegalArgumentException(Tip.INDEX_OUTOFBOND);
        }

        if(index < 0){
            throw new IllegalArgumentException(Tip.INDEX_ZERO);
        }
    }

    /**
     * 动态数组长度(有效的元素个数)
     * @return int
     */
    public int size(){
        return this.index;
    }

    /**
     * 删除 当前下标对应在的元素
     * @param index 下标
     * @return true
     */
    public boolean delete(int index){
        checkIndexException(index);

        if(index != size()-1){
            System.arraycopy(this.arr,index+1,this.arr,index,this.index-index-1);
        }

        this.index--;
        return true;
    }

    /**
     * py go java [1,5) [1,5] (1,5)
     * @param from
     * @param to
     * @return
     */
    public boolean delete(int from ,int to){
        checkIndexException(from);
        checkIndexException(to);
        if(from >= to){
            return delete(from);
        }

        System.arraycopy(this.arr,to,this.arr,from,this.index-to);

        this.index-=to-from;
        return true;
    }

    /**
     * 用来获得当前下标所对应的元素
     * @param index 下标
     * @return  int
     */
    public int get(int index){
        checkIndexException(index);
        return this.arr[index];
    }

    /**
     * 可以让用户 判断然后 调用此方法完成数组arr的缩容
     *  -- 本身不 重复造轮子
     */
    public void trimArr(){
        this.arr = Arrays.copyOf(this.arr,this.size());
    }



}
